package com.game.commons.scripts.java;

import java.io.File;
import java.util.Collection;

import com.game.commons.scripts.java.classlistener.ClassListener;


/**
 * 脚本加载、卸载等功能类<br>
 * @author 杜祥
 * @create 2013-5-11
 */
public interface ScriptContext
{
	/**
	 * 初始化脚本并调用编译任务.<br>
	 * 经过编译的静态标记方法 {@link org.openaion.commons.scripting.metadata.OnClassLoad} 被调用
	 */
	public void init();
	
	
	/**
	 * 释放脚本资源，防止内存泄漏
	 */
	public void shutdown();
	
	
	/**
	 * 卸载
	 */
	public void reload();
	
	
	/**
	 * 获得根目录
	 * 
	 * @return 
	 */
	public File getRoot();
	
	
	/**
	 * 获得脚本编译器结果类
	 * @return
	 * 			脚本编译结果类
	 */
	public CompilationResult getCompilationResult();
	
	
	/**
	 * scriptContext是否初始化
	 * @return
	 * 			ture  初始化完成
	 * 			false  没有初始化
	 */
	public boolean isInitialized();
	
	
	/**
	 * 设置jar文件的路径，这个jar将作为库
	 */
	public void setLibraries(Iterable<File> it);
	
	
	/**
	 * 返回脚本库的列表
	 * @return
	 * 			列表
	 */
	public Iterable<File> getLibraries();
	
	
	/**
	 * 获得父脚本加载卸载类，如果没有则返回null
	 * @return
	 * 				
	 */
	public ScriptContext getParentScriptContext();
	
	
	/**
	 * 获得子脚本加载卸载类,如果没有则返回null
	 * @return
	 */
	public Collection<ScriptContext> getChildScriptContext();
	
	
	/**
	 * 增加一个子脚本加载卸载类
	 * @param context
	 */
	public void addChildScriptContext(ScriptContext context);
	
	
	/**
	 * 设置类监听
	 * @param listener			类监听
	 */
	public void setClassListener(ClassListener listener);
	
	
	/**
	 * 获得类监听
	 * @return		返回类的监听
	 */
	public ClassListener getClassListener();
	
	
	
	/**
	 * 设置编译器类名
	 * @param className			类名
	 */
	public void setCompilerClassName(String className);
	
	
	/**
	 * 获得编译器类名
	 * @return					返回编译器类名
	 */
	public String getCompilerClassName();
	
	
	/**
	 * 比较当前的脚本加载卸载类与指定的对象是否相等。
	 * @param obj
	 * 						对比的对象
	 * @return				相等返回true，否则false
	 */
	@Override
	public boolean equals(Object obj);
	
	
	/**
	 * 返回脚本加载卸载类的哈希值
	 * @return
	 */
	@Override
	public int hashCode();
	
	
	/**
	 * 覆盖总结方法，比避免脚本加载卸载类被GC回收，如果被回收也确保资源被回收。
	 * @throws Throwable
	 */
	void finalize() throws Throwable;
}
